import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer  # 加载乳腺癌数据集
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

# 设置中文显示
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams['axes.unicode_minus'] = False

# 1. 加载乳腺癌数据集（30维）
cancer = load_breast_cancer()
X = cancer.data  # 30维特征数据（包含肿瘤的各种特征）
y = cancer.target  # 类别标签（0=恶性，1=良性）
target_names = cancer.target_names  # 类别名称

# 2. 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 3. 应用PCA降维到2维（便于可视化）
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

# 输出降维信息
print(f"原始数据维度: {X.shape}")
print(f"降维后数据维度: {X_pca.shape}")
print(f"两个主成分解释的方差比例: {np.round(pca.explained_variance_ratio_, 4)}")
print(f"累计解释方差比例: {sum(pca.explained_variance_ratio_):.4f}")

# 4. 可视化降维结果
plt.figure(figsize=(10, 7))
colors = ['red', 'blue']  # 两种类别使用不同颜色
markers = ['o', 's']  # 两种类别使用不同标记

# 绘制散点图
for color, marker, target_name, i in zip(colors, markers, target_names, range(2)):
    plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1],
                color=color, marker=marker,
                label=target_name, alpha=0.7)

# 添加标签和标题
plt.xlabel(f'主成分1 (解释方差: {pca.explained_variance_ratio_[0]:.2%})')
plt.ylabel(f'主成分2 (解释方差: {pca.explained_variance_ratio_[1]:.2%})')
plt.title('乳腺癌数据集PCA降维结果 (30D → 2D)')
plt.legend(title='肿瘤类型')
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()